package team.api;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import org.apache.log4j.Logger;



import study.itwill.common.DBHandler;
import team.item.HealthItem11;
import team.item.h_video_saveItem;

/**
 * CRUD 처리를 하는 클래스 만들기
 * ------------------------------------------
 * 데이터 입출력이 필요한 기능에 대하여,
 * CRATE, READ, UPDATE, DELETE에 해당하는 메서드를
 * 구현해 놓는 처리를 말한다.
 * ------------------------------------------
 * CRATE	--> SQL의 INSERT 구문을 실행한다.
 * READ		--> SQL의 READ 구문을 실행한다.
 * UPDATE	--> SQL의 UPDATE 구문을 실행한다.
 * DELETE	--> SQL의 DELETE 구문을 실행한다.
 * ------------------------------------------
 * CRUD에 해당하는 기능들은 어떤 데이터 처리를 목적으로 하는지가 정해져야 한다.
 * ex)	학생 데이터의 입출력
 * 		교수 데이터의 입출력
 * 		회원 데이터의 입출력
 * 		게시물 데이터의 입출력
 * 		카테고리 데이터의 입출력
 * 		상품 데이터의 입출력
 * ------------------------------------------
 * 메서드들의 이름은 "동사" + "목적어" 형식으로 작성한다.
 * ex) 학생 데이터의 입출력인 경우
 * 		--> insertStudent, updateStudent, deleteStudent, selectStudent
 * ------------------------------------------
 * insert 기능의 경우, 각 데이터를 판별할 수 있는
 * 고유한 값(PK)를 제외하고 INSERT에 처리한 모든 값들을
 * 메서드 파라미터로 전달받아야 한다.
 * 데이터 형은 테이블 구조를 참조하면 된다.
 * 
 * 메서드의 수행 결과는 새롭게 추가된 데이터의 일련번호(seq)를 리턴해 주어야 한다.
 * ------------------------------------------
 * update, delete의 경우 결과를 리턴해 주어야 한다.
 * --> boolean 값을 리턴한다.
 * 
 * UPDATE, DELETE는 각 데이터를 판별할 수 있는
 * 고유한 값(PK)를 파라미터로 전다 받는다.
 * 그 외에 추가적으로 일괄 삭제나, 일괄 수정등을
 * 목적으로 할 경우 상황에 따라 파라미터 형태를
 * 변경할 수 있다.
 * ------------------------------------------
 * 이 클래스들은 DATABASE 접속이 성공 한 이후에 호출된다고 가정되어야 한다.
 */


public class h_video_save {
	
	// Logger 클래스의 인스턴스를 받아온다.
	static Logger logger = Logger.getLogger(h_video_save.class);
	
	private static final String TABLE = "h_video_save";

	public int inserth_video_save(String video_src , String title) {
		//-----------------------------------------
		// 메서드 시작
		//-----------------------------------------
		logger.debug("=============== method start >> inserth_video_save");
		logger.debug("[PARAMS] cate1_name=" + video_src);
		logger.debug("[PARAMS] title=" + title);
		
		
		
		// 리턴할 값 선언
	
		
		// SQL 인젝션 방어
		video_src = video_src.replace("'", "\'");
		title = title.replace("'", "\'");
		
		
		
		//-----------------------------------------
		// 로직 구현
		//-----------------------------------------
		// 테이블이 자동 증가가 아니므로,
		// 최대값 + 1 형식으로 메서드 안에서 생성한다.
	
		
	
		
		// 트랜젝션에 대한 판단이 잘 서지 않는다면, 무조건 하면 된다.
		DBHandler.beginTrans();
		
		// INSERT 처리를 위한 구현
		String sql = "INSERT INTO h_video_save("
	            + " video_src, title,reg_date, edit_date,Health_type_seq,h_good,h_hit,member_seq"
	            + ") VALUES ("
	            + " '%s','%s',now(), now(),1,0,0,7);";
		
		boolean result = DBHandler.execSql(sql, video_src,title);
		int seq = -1;
		//-----------------------------------------
		// 결과처리
		//-----------------------------------------
		if(result) {
			
			DBHandler.commit();
			 seq = DBHandler.getMax(TABLE, "seq", null);
			logger.debug("처리결과 >> " + seq + "번 교수 등록 성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 데이터 추가 실패");
		}
		
		logger.debug("=============== method end >> inserth_video_save");
		
		
		return seq;
	}
	
	public boolean updateh_video_save(int seq, String viedo_src, String title  ) {
		logger.debug("=============== method start >> updateh_video_save");
		logger.debug("[PARAMS] seq=" + seq);
		logger.debug("[PARAMS] viedo_src=" + viedo_src);
		logger.debug("[PARAMS] title=" + title);
	
		
		// SQL 인젝션 방어
		viedo_src = viedo_src.replace("'", "\'");
		title = title.replace("'", "\'");
				boolean result = false;
		
		DBHandler.beginTrans();
		
		String sql = "UPDATE h_video_save SET video_src = '%s',title='%s', edit_date = now() WHERE seq = %d;";
				
		result = DBHandler.execSql(sql, viedo_src,title,  seq);
		
		if(result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 교수 수정성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 데이터 수정 실패 ");
		}
		
		logger.debug("=============== method end >> updateh_video_save");
		
		return result;
	}
	
	public boolean deleteh_video_save(int seq) {
		logger.debug("=============== method start >> deleteh_video_save");
		logger.debug("[PARAMS] seq=" + seq);
		
		boolean result = false;
		
		// 이 데이터를 참조하는 다른 데이터들의 존재 여부 검사
		// SELECT COUNT(studno) FROM student WHERE seq=?
		if (DBHandler.getCount("h_video_save", "seq", "seq=" + seq) > 0) {
			logger.error("참조 무결성 위반");
			return result;
		}
		
		
		DBHandler.beginTrans();
		
		String sql = "DELETE FROM h_video_save WHERE seq = %d";
		result = DBHandler.execSql(sql, seq);
		
		if(result) {
			DBHandler.commit();
			logger.debug("처리결과 >> " + seq + "번 교수 삭제 성공");
		} else {
			DBHandler.rollback();
			logger.error("처리결과 >> 데이터 삭제 실패 ");
		}
		
		logger.debug("=============== method end >> deleteh_video_save");
		
		return result;
		
	}
	
	/**
	 * 
	 * @param	seq
	 * @return	h_video_saveItem
	 */
	public h_video_saveItem selecth_video_save(int seq) {
		logger.debug("=============== method start >> selecth_video_save");
		logger.debug("[PARAMS] seq=" + seq);
		
		h_video_saveItem item = null;
		
		// 데이터 조회
		String sql = " SELECT\n" +
				" seq,\n" +
				" video_src,\n" +
				" title,\n" +
				" reg_date,\n" + 
				" edit_date\n" +	
				" Health_type_seq\n" +
				" h_good\n" +
				" h_hit\n" +
				" member_seq\n" +
				" FROM\n" +
				" h_video_save \n" +				
				" where\n" +
				" seq = %d;";

		ResultSet rs = DBHandler.getResult(sql, seq);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				rs.next();
				
				// 1) ResultSet의 모든 데이터를 변수로 추출
				int seqq = rs.getInt(1);
				String video_src = rs.getString(2);
				String title = rs.getString(3);
				String reg_date = rs.getString(4);
				String edit_date = rs.getString(5);
				int Health_type_seq = rs.getInt(6);
				int h_good = rs.getInt(7);
				int h_hit = rs.getInt(8);
				int member_seq = rs.getInt(9);
			
				
				// 2) 추출된 값을 객체로 구성
				item = new h_video_saveItem(seqq, video_src,title, reg_date,edit_date,Health_type_seq,h_good,h_hit,member_seq);
				
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 3) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(item == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공");
			logger.debug(item.toString());
		}
				
		logger.debug("=============== method end >> selecth_video_save");
		
		return item;
		
	}
	
	/**
	 * 교수목록의 데이터를 조회하여 리턴하는 메서드
	 * @return	ArrayList<h_video_saveItem>
	 */
	public ArrayList<h_video_saveItem> selecth_video_saveList() {
		logger.debug("=============== method start >> selecth_video_saveList");
		
		ArrayList<h_video_saveItem> list = null;
		
		// 데이터 조회
		String sql = " SELECT\n" +
				" seq,\n" +
				" video_src,\n" +
				" title,\n" +
				" reg_date,\n" + 
				" edit_date\n" +
				" Health_type_seq,\n" +
				" h_good,\n" +
				" h_hit,\n" +
				" member_seq\n" +
				" FROM\n" +
				" h_video_save ;" ;
				

		
		/* 파라미터에 따라서 검색조건 지정
		if(p_grade > 0) {
			sql += " WHERE grade='" + p_grade + "'";
		}*/
		
		ResultSet rs = DBHandler.getResult(sql);
		
		if(rs != null) {
			// 데이터 조회 결과 있는 경우
			try {
				list = new ArrayList<h_video_saveItem>();
				
				while(rs.next()) {
					
					// 1) ResultSet의 모든 데이터를 변수로 추출
					int seqq = rs.getInt(1);
					String video_src = rs.getString(2);
					String title = rs.getString(3);
					String reg_date = rs.getString(4);
					String edit_date = rs.getString(5);
					int Health_type_seq = rs.getInt(6);
					int h_good = rs.getInt(7);
					int h_hit = rs.getInt(8);
					int member_seq = rs.getInt(9);
					
					
					// 2) 추출된 값을 객체로 구성
					h_video_saveItem item = new h_video_saveItem(seqq, video_src,title, reg_date,edit_date,Health_type_seq,h_good,h_hit,member_seq);
					
					// 3) ArrayList에 추가
					list.add(item);
				}
			} catch (SQLException e) {
				logger.error(e);
			} finally {
				// 4) 데이터 조회에 대한 메모리 반납
				try {
					rs.close();
				} catch (SQLException e) {}
				rs = null;
			}
		}
		
		if(list == null) {
			logger.error("데이터 조회 실패");
		} else {
			logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
		}
		
		logger.debug("=============== method end >> selecth_video_saveList");
		
		return list;
	}
	/**
	  * 제목 작성
	  * @param health_name 운동법
	  * @param reg_date 등록일시
	  * @param edit_date 수정일시
	  * @return
	  */
	
	 public int h_title(String video_src, String title) {
			// ---------------------------------------------
			// 메소드 시작
			// ---------------------------------------------
			logger.debug("=================== method start >> inserth_video_save");

			logger.debug("[PARAMS] video_src = " + video_src);
			logger.debug("[PARAMS] title = " + title);			
			

			// SQL 인젝션 방어
			video_src = video_src.replace("'", "\'");
			title = title.replace("'", "\'");
		

			// ---------------------------------------------------------------
			// 로직 구현
			// ---------------------------------------------------------------
			// 테이블이 자동 증가가 아니므로,
			// 최대값 + 1 형식으로 메소드 안에서 생성한다
			int seq = DBHandler.getMax(TABLE, "seq", null) + 1;

			logger.debug("자동 생성된 학생 번호 : " + seq);

			// 트렌젝션에 대한 판단이 잘 서지 않는다면,
			// 무조건 하면 된다.
			DBHandler.beginTrans();

			// INSERT 처리를 위한 구현
			String sql = "INSERT INTO h_video_save("
					+ " video_src, title, reg_date, edit_date, Health_type_seq"
					+ ") VALUES (" + " '%s', '%s', now(), now(), %d);";

			boolean result = DBHandler.execSql(sql, video_src, title );

			// -----------------------------------------------------------------
			// 결과처리
			// -----------------------------------------------------------------

			if (result) {
				DBHandler.commit();
				logger.debug("처리결과 >> " + seq + "번 댓글 등록 성공");
			} else {
				DBHandler.rollback();
				logger.debug("처리결과 >> 데이터 추가 실패");
			}

			logger.debug("===================== method end >> inserth_video_save");

			return seq;

		}
	 
	/**
	 * 제목 수정
	 * @param seq 일련번호
	 * @param health_name 운동법
	 * @param reg_date 등록일시
	 * @param edit_date 수정일시
	 * @return
	 */
	 public boolean h_title_update(int seq, String video_src, String title) {

			logger.debug("=================== method start >> inserth_video_save");

			logger.debug("[PARAMS] video_src = " + video_src);
			logger.debug("[PARAMS] title = " + title);
			
		
			logger.debug("[PARAMS] seq = " + seq);

			// 리턴할 값 선언
			boolean result = false;

			// SQL 인젝션 방어
			video_src = video_src.replace("'", "\'");
			title = title.replace("'", "\'");
			

			// 트렌젝션에 대한 판단이 잘 서지 않는다면,
			// 무조건 하면 된다.
			DBHandler.beginTrans();

			String sql = "UPDATE h_video_save SET " +"seq=%d" + "video_src='%s',"
					+ "title='%s'," +  "edit_date=now(), "
					+ "Health_type_seq=%d " + "WHERE seq=%d";

			result = DBHandler.execSql(sql, seq, video_src);

			// ---------------------------------------------
			// 결과처리
			// ---------------------------------------------

			if (result) {
				DBHandler.commit();
				logger.debug("처리결과 >> " + seq + "번 게시판 수정 성공");
			} else {
				DBHandler.rollback();
				logger.debug("처리결과 >> 데이터 삭제 실패");
			}

			logger.debug("=========== method end >> updateboard");

			return result;
		}
	 /**
	  * 조회수
	  * @param seq 일련번호
	  * @return
	  */
	 public HealthItem11 h_count(int seq) {
			HealthItem11 result = null;
		    logger.debug("============ method start >> addStudent");
			logger.debug(" -- [PARAMS INFO] -- ");	
			logger.debug("seq: " + seq);
			logger.debug("============ method end >> addStudent");

	 return result;
	 }
	 
	 /** 
	  * 
	  * @return 검색(글 제목)
	  */
	 public ArrayList<HealthItem11> h_search_title(int seq) {
		 logger.debug("================== method start >> selecth_video_save");

			ArrayList<HealthItem11> list = null;

			// 데이터 조회

			String sql = " SELECT \n " +
					" hv.title \n " +
					" FROM \n " +
					" h_video_save hv \n " +
					" INNER JOIN \n" +
					" on h.seq = hv.Health_type_seq";

		/**	// 파라미터에 따라서 검색조건 지정

			if (seq > 0) {
				sql += " WHERE seq='" + seq + "'";
			} */

			ResultSet rs = DBHandler.getResult(sql);

			if (rs != null) {
				// 데이터 조회 결과 있는 경우
				try {
					list = new ArrayList<HealthItem11>();

					while (rs.next()) {

						// 1) ResultSet의 모든 데이터를 변수로 추출

						int sno = rs.getInt(1);
						String video_src = rs.getString(2);
						String title = rs.getString(3);
						String reg_date = rs.getString(4);
						String edit_date = rs.getString(5);
						int Health_type_seq = rs.getInt(6);

						// 2) 추출된 값을 객체로 구성
						HealthItem11 item = new HealthItem11(sno, video_src,
								title, reg_date, edit_date, Health_type_seq);

						// 3) ArrayList에 추가
						list.add(item);

					}
				} catch (SQLException e) {
					logger.error(e);
				} finally {
					// 4) 데이터 조회에 대한 메모리 반납
					try {
						rs.close();
					} catch (SQLException e) {
					}
					rs = null;
				}
			}

			if (list == null) {
				logger.error("데이터 조회 실패");
			} else {
				logger.debug("데이터 조회 성공 >> " + list.size() + "건 조회됨");
			}

			logger.debug("================== method end >> selectboard");

			return list;
		}
		
	

}